/**
 * es7 引入了async：它就是 Generator 函数的语法糖
 * async 函数就是将 Generator 函数的星号（*替换成 async ，将 yield 替换成 await ，仅此而己。
 * async 函数对 Generator 函数的改进: 内置执行器、更好的语义、更广的适用性、返回的是promise
 */

/* 使用状态机
let gen = function* () {
  let f1 = yield readFile('/etc/fstab')
  let f2 = yield readFile('/etc/shells')
  console.log(f1.toString())
  console.log(f2.toString())
}
let g = gen()
console.log(g.next())
console.log(g.next())*/

let asyncReadFile = async function () {
  let f1 = await readFile('/etc/aw')
  let f2 = await readFile('/etc/static')
  console.log(f1.toString())
  console.log(f2.toString())
}
/**
 * async 函数完全可以看作由多个异步操作包装成的 Promise 对象，而 await 命令就是内部 then 命令的语法糖。
 * async 函数的语法规则总体上来说比较简单，难点是错误处理机制。
 * 正常情况下，await 命令后面是 promise 对象。如果不是，会被转成一个立即 resolve 的 Promise 对象
 * await 命令后面的 promise 对象如果变为 reject 状态，则 reject 参数会被 catch 方法的回调函数接收到。
 */

let asyncGetData = async function () {
  try {
    let res = await getDataApi('/get')
  } catch (e) {
    console.log(e)
  }
  // 第一个await 出现错误也不会中断下面的await
  return await getJson('/get.json')
}
